#include <stdio.h>
#include "list.h"
//#include "zflist.h"
//#include "fzlist.h"
#include "list_type.h"
LIST_ROOT_INIT( ROOT );
int main(){
	int int_data = 8;
	char char_data = 'A';
	char  string_data[] = "hello world";
	float float_data = 3.1415926f;
	LIST_NODE * node_temp;
	LIST_NODE node;
//while(1){
	/* test LIST_INIT */
	LIST_REPORT_TEST( &ROOT , "LIST_INIT");

	/* test list_push_front */
	node_temp = _list_node_create();
	_list_node_set_parm( node_temp , &ROOT , &int_data , sizeof(int) , LIST_INT , false);
	_list_root_push_front( &ROOT , node_temp );
	LIST_REPORT_TEST( &ROOT , "list_push_front");

	/* test list_push_back */
	node_temp = _list_node_create();
	_list_node_set_parm_deep( node_temp , &ROOT , string_data , sizeof(string_data) , LIST_STRING );
	_list_root_push_front( &ROOT , node_temp );
	LIST_REPORT_TEST( &ROOT , "list_push_back");

	_list_node_init( &node );
	_list_node_set_parm( &node , &ROOT , &float_data , sizeof(float) , LIST_FLOAT , false );
	node_temp = _list_node_copy( &node );
	_list_root_push_back( &ROOT , node_temp );
	LIST_REPORT_TEST( &ROOT , "list_push_back");


	void del_item( LIST_ROOT * root_p , LIST_NODE * node_p , void * data_p ){

		if( node_p->type == LIST_INT ){
			_list_root_insert_node_before( root_p , node_p ,&node );
			_list_root_insert_node_after( root_p , node_p , _list_node_copy( &node ) );
		}
		return;
	}
	
	_list_root_foreach( &ROOT , del_item , NULL) ;
	LIST_REPORT_TEST( &ROOT , "list_push_back");

	_list_root_erase( &ROOT );
	usleep(100);
//}
	
#if 0	
	/* list_get_node_pos */
	printf("\n***********************************\n");
	node_temp = list_get_node_pos_ptr( &ROOT , 1 );
	LIST_SHOW( &ROOT , node_temp , NULL);
	/* test list_pop_front */	
	node_temp = list_pop_front( &ROOT );
	printf("!!!!!!!!!!\n");
	LIST_SHOW( &ROOT , node_temp );
	list_node_free( node_temp );
	LIST_REPORT_TEST( &ROOT , "list_pop_front");

	/* test list_pop_back */	
	node_temp = list_pop_back( &ROOT );
	printf("!!!!!!!!!!\n");
	LIST_SHOW( &ROOT , node_temp );
	list_node_free( node_temp );
	LIST_REPORT_TEST( &ROOT , "list_pop_back");

//	list_node_remove( &ROOT , &ROOT.root);
	void del_item(LIST_ROOT * root_p , LIST_NODE * node_p , void * data_p ){
		assert( root_p );
		assert( node_p );
		if( node_p->type == LIST_INT ){
			list_remove_free( root_p , node_p );	
		}
//		LIST_SHOW( root_p , node_p );

		return;
	} 
	printf("*********************************************************\n");
	list_foreach_front( &ROOT , del_item , NULL );
	LIST_REPORT_TEST( &ROOT , "list_foreach_front");


	printf("*********************************************************\n");
	list_foreach_back( &ROOT , LIST_SHOW , NULL );
	LIST_REPORT_TEST( &ROOT , "list_foreach_back");
#endif

	
#if 0

	/* test LIST_PREV */
	LIST_PREV( &ROOT , &node_temp );
	LIST_REPORT_SINGLE( &ROOT , node_temp , "LIST_PREV");

	/* test LIST_PREV */
	LIST_PREV( &ROOT , &node_temp );
	LIST_REPORT_SINGLE( &ROOT , node_temp , "LIST_PREV");
	
	/* test LIST_NEXT */
	LIST_NEXT( &ROOT , &node_temp );
	LIST_REPORT_SINGLE( &ROOT , node_temp , "LIST_NEXT");
	
	/* test LIST_NEXT */
	LIST_NEXT( &ROOT , &node_temp );
	LIST_REPORT_SINGLE( &ROOT , node_temp , "LIST_NEXT");

	/* test LIST_LOCATE_LOOP */
	LIST_LOCATE_LOOP( &ROOT , 3 , &node_temp );
	LIST_REPORT_SINGLE( &ROOT , node_temp , "LIST_LOCATE_LOOP");
//	LIST_REPORT_TEST( &ROOT , "LIST_LOCATE_LOOP");
	
	/* test LIST_ADD_BEFORE */
	LIST_ADD_BEFORE( &ROOT , node_temp , string_data , sizeof( string_data ) , LIST_STRING );
	LIST_REPORT_TEST( &ROOT , "LIST_ADD_BEFORE");

	/* test LIST_ADD_AFTER */
	LIST_ADD_AFTER( &ROOT , node_temp , &float_data , sizeof( float ) , LIST_FLOAT );
	LIST_REPORT_TEST( &ROOT , "LIST_ADD_AFTER");

	/* test LIST_PREV */
	LIST_PREV( &ROOT , &node_temp );
	LIST_PREV( &ROOT , &node_temp );
	LIST_REPORT_SINGLE( &ROOT , node_temp , "LIST_PREV");
	
	/* test LIST_NEXT */
	LIST_NEXT( &ROOT , &node_temp );
	LIST_REPORT_SINGLE( &ROOT , node_temp , "LIST_NEXT");

	/* test LIST_DEL_HEAD */
	LIST_DEL_HEAD( &ROOT );
	LIST_REPORT_TEST( &ROOT , "LIST_DEL_HEAD");
	
	/* test LIST_DEL_TAIL */
	LIST_DEL_TAIL( &ROOT );
	LIST_REPORT_TEST( &ROOT , "LIST_DEL_TAIL");

	/* test LIST_DEL_ITEM */
	LIST_DEL_ITEM( &ROOT , node_temp );
	LIST_REPORT_TEST( &ROOT , "LIST_DEL_ITEM");
	/* test EXTERN_LIST */
	test_extern();
	return 0;
#endif
	
}
